<?php

require_once('../commons_constantes.php');

define('TAB_DEFINITION'		,'TAB_DEFINITION');
define('TAB_GET_ALL'			,'TAB_GET_ALL');
define('TAB_GET_ID'			,'TAB_GET_ID');
define('TAB_GET_NAME'		,'TAB_GET_NAME');
define('TAB_GET_ID_BY_CODE'	,'TAB_GET_ID_BY_CODE');
define('TAB_GET_HTML'		,'TAB_GET_HTML');
define('TAB_GET_MAX'		,'TAB_GET_MAX');
define('TAB_GET_DEFAULT'	,'TAB_GET_DEFAULT');
define('TAB_GET_CHILDREN'	,'TAB_GET_CHILDREN');
define('TAB_GET_DISPLAY'	,'TAB_GET_DISPLAY');


/**
 * Fonction de définition d'un onglet
 * @param $getter : getter de la focntion de définition des onglets
 * @param $idTab : identifiant de l'onglet
 * @param $codeTab : code de l'onglet
 * @param $tabName : nom de l'onglet
 * @param $html : fichier HTML correspondant à l'onglet
 * @param $isDefault : marqueur disant si l'onglet est celui par défaut
 * @param $codeTabChildren : array of tab codes of children tabs of tab with id $idTab
 */
function tabDefinition
	($getter
	,$idTab=null
	,$codeTab=null
	,$tabName=null
	,$html=null
	,$isDefault=false
	,$codeTabChildren=null
	,$toDisplay=true
	)
{
	static $tabs = null;
	static $codeTabs = null;
	switch($getter) {
		case TAB_DEFINITION:
			if (isset($tabs[$idTab])) {
				throw new Exception('L\'identifiant d\'onglet "'.$idTab.'" est déjà défini', ERR_TECHNICAL);
			} else if (isset($codeTabs[$codeTab])) {
				throw new Exception('Le code d\'onglet "'.$codeTab.'" est déjà défini', ERR_TECHNICAL);
			}
			$tabs[$idTab] = array
							(TAB_GET_ID			=> $idTab
							,TAB_GET_ID_BY_CODE => $codeTab
							,TAB_GET_NAME		=> $tabName
							,TAB_GET_HTML		=> $html
							,TAB_GET_DEFAULT	=> $isDefault
							,TAB_GET_CHILDREN	=> $codeTabChildren
							,TAB_GET_DISPLAY	=> $toDisplay
							);
			$codeTabs[$codeTab] = true;
			return null;
			break;
			
		case TAB_GET_ID:
			if (!is_null($idTab) && isset($tabs[$idTab])) {
				return $idTab;
			}
			throw new Exception('L\'identifiant d\'onglet '.$idTab.' n\'est pas défini', ERR_TECHNICAL);
			break;
			
		case TAB_GET_ID_BY_CODE:
			if (!is_null($codeTab)) {
				foreach ($tabs as $id => $ary) {
					if ($codeTab === $ary[TAB_GET_ID_BY_CODE]) {
						return $id;
					}
				}
			}
			throw new Exception('Le code d\'onglet '.$codeTab.' n\'est pas défini', ERR_TECHNICAL);
			break;
			
		case TAB_GET_NAME:
			if (!is_null($idTab) && isset($tabs[$idTab])) {
				return $tabs[$idTab][TAB_GET_NAME];
			}
			throw new Exception('L\'identifiant d\'onglet '.$idTab.' n\'est pas défini', ERR_TECHNICAL);
			break;
			
		case TAB_GET_HTML:
			if (!is_null($idTab) && isset($tabs[$idTab])) {
				return $tabs[$idTab][TAB_GET_HTML];
			}
			throw new Exception('L\'identifiant d\'onglet '.$idTab.' n\'est pas défini', ERR_TECHNICAL);
			break;
			
		case TAB_GET_MAX:
			$max = -1;
			foreach ($tabs as $id => $ary) {
				if ($max <= $id) {
					$max = $id;
				}
			}
			return $max;
			break;
			
		case TAB_GET_DEFAULT:
			foreach ($tabs as $id => $aryTab) {
				if ($aryTab[TAB_GET_DEFAULT] === true) {
					return $id;
				}
			}
			return null;
			break;
			
		case TAB_GET_CHILDREN:
			if (!is_null($idTab) && isset($tabs[$idTab])) {
				return $tabs[$idTab][TAB_GET_CHILDREN];
			}
			throw new Exception('L\'identifiant d\'onglet '.$idTab.' n\'est pas défini', ERR_TECHNICAL);
			break;
			
		case TAB_GET_DISPLAY:
			if (!is_null($idTab) && isset($tabs[$idTab])) {
				return $tabs[$idTab][TAB_GET_DISPLAY];
			}
			throw new Exception('L\'identifiant d\'onglet '.$idTab.' n\'est pas défini', ERR_TECHNICAL);
			break;
			
		case TAB_GET_ALL:
			if (!is_null($tabs)) {
				return $tabs;
			}
			throw new Exception('Le tableau des onglets n\'est pas initialisé', ERR_TECHNICAL);
			break;
			
		default:
			throw new Exception('Fonction tableDefinition : accesseur ' . $getter . ' non défini', ERR_TECHNICAL);
	}
}

/**
 * Retourne le tableau des onglets pour l'ensemble des onglets existants
 * @return array : le tableau des onglets
 */
function tabGetAll() {
	return tabDefinition(TAB_GET_ALL);
}

/**
 * Retourne l'identifiant maximum des onglets
 * @return int
 * @throws Exception
 */
function tabGetMax() {
	return tabDefinition(TAB_GET_MAX);
}

/**
 * Retourne l'identifiant du premier l'onglet marqué comme par défaut trouvé.<br />
 * Null est retourné si aucun onglet n'est trouvé
 */
function tabGetDefault() {
	return tabDefinition(TAB_GET_DEFAULT);
}

/**
 * Retourne le nom de l'onglet d'identifiant $idTab.<br />
 * Lève une exception si l'identifiant fourni n'est pas connu
 * @param int $idTab
 * @return string
 */
function tabGetName($idTab) {
	return tabDefinition(TAB_GET_NAME, $idTab);
}

/**
 * Retourne le nom du fichier html correspondant à l'onglet d'identifiant $idTab.<br />
 * Lève une exception si l'identifiant fourni n'est pas connu
 * @param int $idTab
 * @return string
 */
function tabGetHtml($idTab) {
	return tabDefinition(TAB_GET_HTML, $idTab);
}

/**
 * Retourne l'identifiant de l'onglet de code $codeTab<br />
 * Lève une exception si aucun résultat n'est trouvé
 * @param string $codeTab code de l'onglet
 * @return int
 */
function tabGetIdByCode($codeTab) {
	return tabDefinition(TAB_GET_ID_BY_CODE, null, $codeTab);
}

/**
 * Retourne la tableau des codes d'onglet fils de l'onglet courant
 * @param $idTab identifiant de l'onglet courant
 * @return le tableau des codes d'onglet des sous-onglets
 */
function tabGetCodeTabChildren($idTab) {
	return tabDefinition(TAB_GET_CHILDREN, $idTab);
}

/**
 * Return true if the $codeTab in parameter is a $codeTab child of another tab
 * @param $idTab id tab to look for an ancestor
 * @return true / false
 */
function tabIsChildTab($idTab){
	$tabs = tabGetAll();
	foreach ($tabs as $idTab => $tab) {
		if (isset($tab[TAB_GET_CHILDREN]) && !is_null($tab[TAB_GET_CHILDREN]) && is_array($tab[TAB_GET_CHILDREN])) {
			return in_array($tabs[$idTab][TAB_GET_ID_BY_CODE], $tab[TAB_GET_CHILDREN]);
		}
	}
	return false;
}

/**
 * Retourne un booléen disant si oui ou non l'onglet est à afficher
 * @param $idTab identifiant de l'onglet courant
 * @return true / false
 */
function tabGetToDisplay($idTab) {
	return tabDefinition(TAB_GET_DISPLAY, $idTab);
}

/**
 * Return the whole list of children tab in an array with key equal to the id of child tab
 * @return array of tab children by their id
 */
function tabGetAllTabChildrenById() {
	$mapTabChildrenById = array();
	$tabs = tabGetAll();
	foreach ($tabs as $idTab => $tab) {
		if (isset($tab[TAB_GET_CHILDREN]) && !is_null($tab[TAB_GET_CHILDREN]) && is_array($tab[TAB_GET_CHILDREN])) {
			foreach ($tab[TAB_GET_CHILDREN] as $codeTabChild) {
				$idTabChild = tabGetIdByCode($codeTabChild);
				$mapTabChildrenById[$idTabChild] = $tabs[$idTabChild];
			}
		}
	}
	return $mapTabChildrenById;
}
